#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302.h"
#include "Key.h"
#include "Timer0.h"
#include "DS18B20.h"
#include "Delay.h"
#include "stop_watch.h"

// 注：主函数会比较长，但是逻辑还算清晰，稍微要花时间研究一下

unsigned char KeyNum, clock_mode = 0, TimeSetSelect, TimeSetFlashFlag = 0, Flashflag_flag = 0;
unsigned char MODE = 0;						 // 0为时钟，1为秒表，2为倒计时
unsigned char Min = 0, Sec = 0, MiniSec = 0; // 秒表变量
float T;									 // 温度
int stopwatch_flag = 0;						 // 秒表标志

// 时间显示功能 调用LCD1602 封装了一下
void TimeShow(void)
{
	DS1302_ReadTime();					  // 读取时间
	LCD_ShowNum(1, 1, DS1302_Time[0], 2); // 显示年
	LCD_ShowNum(1, 4, DS1302_Time[1], 2); // 显示月
	LCD_ShowNum(1, 7, DS1302_Time[2], 2); // 显示日
	LCD_ShowNum(2, 1, DS1302_Time[3], 2); // 显示时
	LCD_ShowNum(2, 4, DS1302_Time[4], 2); // 显示分
	LCD_ShowNum(2, 7, DS1302_Time[5], 2); // 显示秒
}

// 时间设置功能
// 对应独立按键如下使用
// K1：模式切换，数字闪烁时才可以进行按键调节
// K2：选中对象切换，数字闪烁时按下可以切换选择对象
// K3：++
// K4: --
void TimeSet(void)
{
	if (KeyNum == 2) // 按键1按下
	{
		TimeSetSelect++;	// 设置选择位加1
		TimeSetSelect %= 6; // 越界清零
	}
	if (KeyNum == 3) // 按键3按下
	{
		DS1302_Time[TimeSetSelect]++; // 时间设置位数值加1
		if (DS1302_Time[0] > 99)
		{
			DS1302_Time[0] = 0;
		} // 年越界判断
		if (DS1302_Time[1] > 12)
		{
			DS1302_Time[1] = 1;
		} // 月越界判断
		if (DS1302_Time[1] == 1 || DS1302_Time[1] == 3 || DS1302_Time[1] == 5 || DS1302_Time[1] == 7 ||
			DS1302_Time[1] == 8 || DS1302_Time[1] == 10 || DS1302_Time[1] == 12) // 日越界判断
		{
			if (DS1302_Time[2] > 31)
			{
				DS1302_Time[2] = 1;
			} // 大月
		}
		else if (DS1302_Time[1] == 4 || DS1302_Time[1] == 6 || DS1302_Time[1] == 9 || DS1302_Time[1] == 11)
		{
			if (DS1302_Time[2] > 30)
			{
				DS1302_Time[2] = 1;
			} // 小月
		}
		else if (DS1302_Time[1] == 2)
		{
			if (DS1302_Time[0] % 4 == 0)
			{
				if (DS1302_Time[2] > 29)
				{
					DS1302_Time[2] = 1;
				} // 闰年2月
			}
			else
			{
				if (DS1302_Time[2] > 28)
				{
					DS1302_Time[2] = 1;
				} // 平年2月
			}
		}
		if (DS1302_Time[3] > 23)
		{
			DS1302_Time[3] = 0;
		} // 时越界判断
		if (DS1302_Time[4] > 59)
		{
			DS1302_Time[4] = 0;
		} // 分越界判断
		if (DS1302_Time[5] > 59)
		{
			DS1302_Time[5] = 0;
		} // 秒越界判断
	}
	if (KeyNum == 4) // 按键4按下
	{
		DS1302_Time[TimeSetSelect]--; // 时间设置位数值减1
		if (DS1302_Time[0] < 0)
		{
			DS1302_Time[0] = 99;
		} // 年越界判断
		if (DS1302_Time[1] < 1)
		{
			DS1302_Time[1] = 12;
		} // 月越界判断
		if (DS1302_Time[1] == 1 || DS1302_Time[1] == 3 || DS1302_Time[1] == 5 || DS1302_Time[1] == 7 ||
			DS1302_Time[1] == 8 || DS1302_Time[1] == 10 || DS1302_Time[1] == 12) // 日越界判断
		{
			if (DS1302_Time[2] < 1)
			{
				DS1302_Time[2] = 31;
			} // 大月
			if (DS1302_Time[2] > 31)
			{
				DS1302_Time[2] = 1;
			}
		}
		else if (DS1302_Time[1] == 4 || DS1302_Time[1] == 6 || DS1302_Time[1] == 9 || DS1302_Time[1] == 11)
		{
			if (DS1302_Time[2] < 1)
			{
				DS1302_Time[2] = 30;
			} // 小月
			if (DS1302_Time[2] > 30)
			{
				DS1302_Time[2] = 1;
			}
		}
		else if (DS1302_Time[1] == 2)
		{
			if (DS1302_Time[0] % 4 == 0)
			{
				if (DS1302_Time[2] < 1)
				{
					DS1302_Time[2] = 29;
				} // 闰年2月
				if (DS1302_Time[2] > 29)
				{
					DS1302_Time[2] = 1;
				}
			}
			else
			{
				if (DS1302_Time[2] < 1)
				{
					DS1302_Time[2] = 28;
				} // 平年2月
				if (DS1302_Time[2] > 28)
				{
					DS1302_Time[2] = 1;
				}
			}
		}
		if (DS1302_Time[3] < 0)
		{
			DS1302_Time[3] = 23;
		} // 时越界判断
		if (DS1302_Time[4] < 0)
		{
			DS1302_Time[4] = 59;
		} // 分越界判断
		if (DS1302_Time[5] < 0)
		{
			DS1302_Time[5] = 59;
		} // 秒越界判断
	}

	// 更新显示，根据TimeSetSelect和TimeSetFlashFlag判断可完成闪烁功能
	if (TimeSetSelect == 0 && TimeSetFlashFlag == 1)
	{
		LCD_ShowString(1, 1, "  ");
	}
	else
	{
		LCD_ShowNum(1, 1, DS1302_Time[0], 2);
	}
	if (TimeSetSelect == 1 && TimeSetFlashFlag == 1)
	{
		LCD_ShowString(1, 4, "  ");
	}
	else
	{
		LCD_ShowNum(1, 4, DS1302_Time[1], 2);
	}
	if (TimeSetSelect == 2 && TimeSetFlashFlag == 1)
	{
		LCD_ShowString(1, 7, "  ");
	}
	else
	{
		LCD_ShowNum(1, 7, DS1302_Time[2], 2);
	}
	if (TimeSetSelect == 3 && TimeSetFlashFlag == 1)
	{
		LCD_ShowString(2, 1, "  ");
	}
	else
	{
		LCD_ShowNum(2, 1, DS1302_Time[3], 2);
	}
	if (TimeSetSelect == 4 && TimeSetFlashFlag == 1)
	{
		LCD_ShowString(2, 4, "  ");
	}
	else
	{
		LCD_ShowNum(2, 4, DS1302_Time[4], 2);
	}
	if (TimeSetSelect == 5 && TimeSetFlashFlag == 1)
	{
		LCD_ShowString(2, 7, "  ");
	}
	else
	{
		LCD_ShowNum(2, 7, DS1302_Time[5], 2);
	}
}

void main()
{
	LCD_Init();
	DS1302_Init();
	Timer0Init();
	Timer1Init();

	// DS18B20_ConvertT(); // 上电先转换一次温度，防止第一次读数据错误
	// Delay(1000); // 等待转换完成
	LCD_ShowString(1, 11, "T:");

	DS1302_SetTime(); // 设置时间

	while (1)
	{
		KeyNum = Key();	 // 读取键码
		if (KeyNum == 5) // K1长按
		{
			if (MODE == 0)
			{
				MODE++;
				stopwatch_flag = 0; // 秒表初始化置0
			}
			else if (MODE == 2)
			{
				MODE = 0;
			}
			else
			{
				MODE++;
			} // 模式切换
		}

		if (MODE == 0)
		{
			LCD_ShowString(1, 1, "  -  -  "); // 时钟界面
			LCD_ShowString(2, 1, "  :  :  ");
			if (KeyNum == 1)
			{
				if (clock_mode == 0)
				{
					clock_mode = 1;
					TimeSetSelect = 0;
				} // 功能切换
				else if (clock_mode == 1)
				{
					clock_mode = 0;
					DS1302_SetTime();
				}
			}

			switch (clock_mode) // mode 0为正常，1为设置
			{
			case 0:
				TimeShow();
				break;
			case 1:
				TimeSet();
				break;
			}
		}

		else if (MODE == 1)
		{
			// 秒表逻辑
			if (stopwatch_flag == 0)
			{
				LCD_ShowString(2, 1, "00-00-00");
				Timer0stop();		// 停止定时器
				Reset_stop_watch(); // 重置秒表
			}
			else if (stopwatch_flag == 1)
			{
				LCD_ShowNum(2, 1, (int)Min / 10, 1); // 显示时间
				LCD_ShowNum(2, 2, (int)Min % 10, 1);
				LCD_ShowNum(2, 4, (int)Sec / 10, 1);
				LCD_ShowNum(2, 5, (int)Sec % 10, 1);
				LCD_ShowNum(2, 7, (int)MiniSec / 10, 1);
				LCD_ShowNum(2, 8, (int)MiniSec % 10, 1);
				Timer0start(); // 启动定时器
			}
			else if (stopwatch_flag == 2) // 暂停
			{
				LCD_ShowNum(2, 1, (int)Min / 10, 1); // 显示时间
				LCD_ShowNum(2, 2, (int)Min % 10, 1);
				LCD_ShowNum(2, 4, (int)Sec / 10, 1);
				LCD_ShowNum(2, 5, (int)Sec % 10, 1);
				LCD_ShowNum(2, 7, (int)MiniSec / 10, 1);
				LCD_ShowNum(2, 8, (int)MiniSec % 10, 1);
			}

			if (KeyNum == 2)
			{
				stopwatch_flag = 1; // 秒表开始计时
			}
			else if (KeyNum == 3)
			{
				stopwatch_flag = 0; // 秒表停止计时
			}
			else if (KeyNum == 4)
			{
				stopwatch_flag = 2; // 停止定时器
				Timer0stop();
			}
		}

		else if (MODE == 2)
		{
			// 倒计时逻辑
		}

		// // 温度读取逻辑
		// DS18B20_ConvertT();	 // 转换温度
		// T = DS18B20_ReadT(); // 读取温度
		// if (T < 0)
		// {
		// 	LCD_ShowChar(2, 1, '-'); // 显示负号
		// 	T = -T;
		// }
		// else
		// {
		// 	LCD_ShowChar(2, 1, '+'); // 显示正号
		// }
		// LCD_ShowNum(2, 2, T, 3); // 显示温度整数部分
		// LCD_ShowChar(2, 5, '.'); // 显示温度小数部分
		// LCD_ShowNum(2, 6, (unsigned long)(T * 10000) % 10000, 4);
	}
}

// 定时器0中断函数
void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count1;
	TH0 = 0xFC; // 置位高位
	TL0 = 0x18; // 置位低位
	T0Count1++;
	if (T0Count1 >= 20)
	{
		T0Count1 = 0;
		Stop_watch();
		MiniSec++;
	}
}

//定时器1中断函数
void Timer1_Routine() interrupt 3
{
	static unsigned int T1Count;
	TL1 = 0x18; // 设置定时初值
	TH1 = 0xFC; // 设置定时初值
	T1Count++;
	if (T1Count >= 400)
	{
		T1Count = 0;
		TimeSetFlashFlag = !TimeSetFlashFlag; // 闪烁标志位取反
	}
}
